package com.yx.changdao.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yx.changdao.common.entity.Problem;
import com.yx.changdao.common.entity.ProblemInfo;
import com.yx.changdao.common.exception.AlertException;
import com.yx.changdao.common.vo.count.input.ProblemCountGlobal;
import com.yx.changdao.common.vo.ProblemVo;
import com.yx.changdao.common.vo.count.input.ProblemPieCount;
import com.yx.changdao.common.vo.count.leader.EmpCount;
import com.yx.changdao.common.vo.count.leader.ProblemGlobal;
import com.yx.changdao.common.vo.count.leader.DeptCount;
import com.yx.changdao.common.vo.count.newleader.ExecuteCount;
import com.yx.changdao.common.vo.count.newleader.TotalCount;
import org.springframework.web.multipart.MultipartFile;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Description: <br/>
 * 问题
 * <p>
 * <br/>
 * @Auther: wangzd
 * @create 2020/04/03 16:51
 */
public interface ProblemService extends IService<Problem> {

    /**
     * 挂起
     */
    boolean hangUp(Integer proId) throws AlertException;

    /**
     * 取消挂起
     */
    boolean hangCancel(Integer proId) throws AlertException;
    /**
     * 根据 ProblemInfoId 获取 Problem 列表
     */
    List<Problem> byInfoId(Integer proInfoId);

    /**
     * 预处理,擦除不允许更新的列;
     */
    void advance(Problem problem);
    /**
     * 问题分配
     */
    boolean assign(Integer proInfoId, List<Integer> depIds,String assignOpinion) throws AlertException;

    /**
     * 问题重新分配
     */
    boolean assignRep(Integer proInfoId, List<Integer> depIds) throws AlertException;

    /**
     * 问题批量分配
     */
    boolean assignBatch(List<Integer> proInfoId, List<Integer> depIds) throws AlertException;

    /**
     * 难度审批通过
     */
    boolean diffOk(Integer proId)throws AlertException;

    /**
     * 难度审批拒绝
     */
    boolean diffRefuse(Integer proId)throws AlertException;

    /**
     * 计算两个日期相差天数,跳过节假日
     */
    Integer lastDay(Date str, Date end);

    /**
     * 延时  简单延期3天, 一般延期2天, 困难延期一个月, 受限延期5天
     */
    boolean delay(Integer proId) throws AlertException;


    /**
     * 问题批量申请
     *
     * @param proId
     */
    boolean apply(Integer proId,String applyDesc) throws AlertException;

    /**
     * 问题批量提交结果
     *
     * @param proIds
     * @param context 问题处理结果
     * @param imgs    处理结果附图
     * @param name    处理人姓名
     */
    boolean submitBatch(List<Integer> proIds, String name, String context, String imgs) throws AlertException;
    /**
     * 提交问题处理结果
     *
     * @param proId
     * @param context 问题处理结果
     * @param imgs    处理结果附图
     * @param name    处理人姓名
     * @param dealPhone    处理人手机号
     */
    boolean submit(Integer proId, String name, String dealPhone, String context, String imgs) throws AlertException;
    /**
     * 问题评价
     *
     * @param type   1满意 ;type : 2 基本满意 ;type : 3 不满意
     */
    boolean assess(Integer proId, Integer type) throws AlertException;

    /**
     * 重新问题评价
     *
     * @param type   1满意 ;type : 2 基本满意 ;type : 3 不满意
     */
    boolean reassess(Integer proId, Integer type) throws AlertException;
    /**
     * 问题批量评价
     *
     * @param type   1满意 ;type : 2 基本满意 ;type : 3 不满意
     */
    boolean assessBatch(List<Integer> proIds, Integer type) throws AlertException;

    /**
     * 问题id
     * info 打回批复
     */
    boolean returnBack(Integer proId, String info) throws AlertException;

    /**
     * 级联加载属性, 如处理结果等
     */
    IPage<ProblemVo> pageNex(IPage<Problem> page, QueryWrapper<Problem> queryWrapper);

    /**
     * 录入问题总计
     * dateType 时间范围
     * Calendar 时间基准
     */
    ProblemCountGlobal countInput(String dateType, Calendar cld) throws AlertException;

    /**
     * 总控部门领导问题统计
     * dateType 时间范围
     * Calendar 时间基准
     */
    ProblemGlobal countLeader(String dateType, Calendar cld) throws AlertException;

    /**
     * 执行部门领导统计
     *  dateType 时间范围
     *  Calendar 时间基准
     */
    ProblemGlobal countExecute(String dateType, Calendar cld) throws AlertException;

    /**
     * 趋势图: 通用
     * status 1 : 录入趋势图
     * status 2 : 总控部门领导
     * status 3: 执行部门领导
     */
    List<List<Serializable>> trend(String dateType, Calendar cld, Integer status) throws AlertException;

    /**
     * 录入饼图统计
     */
    List<ProblemPieCount> pieCount(String dateType, Calendar cld) throws AlertException;

    /**
     * 排名统计部门,
     */
    List<DeptCount> sortCountDept(Integer sort, String type, Calendar cld) throws AlertException;

    /*部门反馈数量,满意度,处理问题数量
     */
    List<DeptCount> othCountDept(String type, Calendar cld) throws AlertException;

    /**
     * 排名统计员工
     */
    List<EmpCount> sortCountEmp(Integer sort, String type, Calendar cld) throws AlertException;

    /**
     * 员工 满意度, 处理数量
     */
    List<EmpCount> othCountEmp(String type, Calendar cld) throws AlertException;

    /**
     * 总控首页统计
     * @return
     */
    TotalCount totalCount();

    /**
     * 执行首页统计
     * @return
     */
    ExecuteCount executeCount();
}
